package com.zhuo.boot;

import ch.qos.logback.core.db.DBHelper;
import com.zhuo.boot.bean.Pet;
import com.zhuo.boot.bean.User;
import com.zhuo.boot.config.MyConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * 主程序类，相当于所有启动的入口
 * @SpringBootApplication 告诉Springboot，这是一个SpringBoot应用
 */

@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        //1、返回IOC容器 ApplicationContext
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

        //查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
        //SpringBoot 已经帮我们配置好了所有Web开发的场景


        //从容器中获取组件
//        Pet tom01 = run.getBean("tom", Pet.class);
//        Pet tom02 = run.getBean("tom", Pet.class);
//        System.out.println("组件tom01是否等于tom02："+(tom01==tom02));//true

        String[] beanNamesForType = run.getBeanNamesForType(User.class);
        System.out.println("====");
        for (String s : beanNamesForType) {
            System.out.println(s);
        }
        System.out.println(run.getBean(DBHelper.class));

        //从容器中获取配置类     com.zhuo.boot.config.MyConfig$$EnhancerBySpringCGLIB$$21c7dbfe@240139e1
        MyConfig bean = run.getBean(MyConfig.class);
        System.out.println(bean);



    }
}
/**
 * Spring的包扫描（组件扫描）规则：主程序所在的包、及其包下的所有子包，里面的组件默认都会被扫描到
 * 若是在主程序包之外，则不会被扫描
 * 现在无需配置包扫描
 *
 * 如果想要改变扫描路径：
 *      可以使用 @SpringBootApplication(scanBasePackages = "com.zhuo")
 *      也可以使用 @ComponentScan 指定扫描路径
 *      @SpringBootApplication 等同于 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan("com.zhuo")
 */

//默认配置最终都是映射到 MultipartProperties 上的，配置文件的值最终会绑定每个类上，这个类会在容器中创建对象

/**
 * 按需加载所有自动配置项:
 *      非常多的starter
 *      引入了哪些场景这个场景的自动配置才会开启（自动配置也是按需加载的）
 *      SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
 */